/**
 * 
 */
package org.swing.utility.jai.component;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.media.jai.PlanarImage;
import javax.swing.Scrollable;
import javax.swing.SwingConstants;
import com.sun.media.jai.widget.DisplayJAI;

/**
 * @author lqnhu
 *
 */
public class PanDisplayJAIScrollable extends DisplayJAI implements Scrollable,
		MouseMotionListener {
	private static final long serialVersionUID = 5910342592700583388L;
	private int maxUnitIncrement = 1;

	/**
	 * @param picture
	 * @param width
	 */
	public PanDisplayJAIScrollable(PlanarImage picture, int width) {
		super(picture);
		maxUnitIncrement = width;
		setAutoscrolls(true);
		addMouseMotionListener(this);
		addMouseListener(this);
	}

	/**
	 * @return the maxUnitIncrement
	 */
	public int getMaxUnitIncrement() {
		return maxUnitIncrement;
	}

	public Dimension getPreferredScrollableViewportSize() {
		return getPreferredSize();
	}

	public int getScrollableUnitIncrement(Rectangle visibleRect,
			int orientation, int direction) {
		// Get the current position.
		int currentPosition = 0;
		if (orientation == SwingConstants.HORIZONTAL) {
			currentPosition = visibleRect.x;
		} else {
			currentPosition = visibleRect.y;
		}
		// Return the number of pixels between currentPosition
		// and the nearest tick mark in the indicated direction.
		if (direction < 0) {
			int newPosition = currentPosition
					- (currentPosition / maxUnitIncrement) * maxUnitIncrement;
			return (newPosition == 0) ? maxUnitIncrement : newPosition;
		} else {
			return ((currentPosition / maxUnitIncrement) + 1)
					* maxUnitIncrement - currentPosition;
		}
	}

	public int getScrollableBlockIncrement(Rectangle visibleRect,
			int orientation, int direction) {
		if (orientation == SwingConstants.HORIZONTAL) {
			return visibleRect.width - maxUnitIncrement;
		} else {
			return visibleRect.height - maxUnitIncrement;
		}
	}

	public boolean getScrollableTracksViewportWidth() {
		return false;
	}

	public boolean getScrollableTracksViewportHeight() {
		return false;
	}

	public void setMaxUnitIncrement(int pixels) {
		maxUnitIncrement = pixels;
	}

	public void mouseDragged(MouseEvent e) {
		Rectangle r = new Rectangle(e.getX(), e.getY(), 1, 1);
		scrollRectToVisible(r);
	}

	public void mouseMoved(MouseEvent e) {
	}
}
